Skip to content

Force commit messages output to UTF-8 - #331087

Open
yutotnh (yutotnh) wants to merge 3 commits into
microsoft:mainfrom
yutotnh:fix-non-utf8-commit-message
Open

Force commit messages output to UTF-8#331087
yutotnh (yutotnh) wants to merge 3 commits into
microsoft:mainfrom
yutotnh:fix-non-utf8-commit-message

Conversation

@yutotnh

Copy link
Copy Markdown
Contributor

Fixes #331086

Summary

I modified the code to enforce the i18n.logOutputEncoding=UTF-8 setting when calling Git.

Test

The test I added checks whether commit messages written in an encoding other than UTF-8 (EUC-JP) are retrieved as UTF-8.
Without my fix, they would be retrieved as EUC-JP, causing the test to fail.

Image

image

Additional Information

Even after applying this setting, my local test results showed that the execution time remained unchanged.

I conducted the following experiment in the vscode repository.

If no settings are specified

$ time for i in $(seq 1 10) ;do git --no-pager log >& /tmp/output.txt ; done

real    0m12.062s
user    0m11.392s
sys     0m0.647s

If a setting is specified

$ time for i in $(seq 1 10) ;do git --no-pager -c i18n.logOutputEncoding=UTF-8 log >& /tmp/output.txt ; done

real    0m11.824s
user    0m11.034s
sys     0m0.768s

Copilot AI balanced review requested due to automatic review settings August 16, 2026 16:13
@vs-code-engineering

Copy link
Copy Markdown
Contributor

📬 CODENOTIFY

The following users are being notified based on files changed in this PR:

Ladislau Szomoru (@lszomoru)

Matched files:

  • extensions/git/src/git.ts
  • extensions/git/src/test/smoke.test.ts

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

This PR improves handling of non-UTF-8 commit message encodings by forcing Git log output to UTF-8 and adds a smoke test to validate that behavior.

Changes:

  • Added a smoke test that commits an EUC-JP encoded message and asserts it’s read back as UTF-8.
  • Updated Git process spawning to apply i18n.logOutputEncoding=UTF-8 via -c for spawned Git commands.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
extensions/git/src/test/smoke.test.ts Adds coverage for reading non-UTF-8 commit messages via repository log.
extensions/git/src/git.ts Forces Git log output encoding to UTF-8 by injecting -c i18n.logOutputEncoding=UTF-8.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread extensions/git/src/git.ts
Comment on lines +703 to 709
// commit messages may appear garbled,
// so the output encoding for commit messages is forced to UTF-8.
const spawnArgs = ['-c', 'i18n.logOutputEncoding=UTF-8', ...args];

return cp.spawn(this.path, spawnArgs, options);
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is still not resolved, and adding these args to every command may not be the best idea...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before I go into the details, please allow me to apologize for the long message.
This is based on machine translation, so I hope it reads clearly on your side.

As you pointed out, -c is currently added to all git invocations. This was a decision I made at the time of implementation.

I considered limiting the flag only to commands that reference i18n.logOutputEncoding, but I was concerned that future additions or changes to those commands might cause some cases to slip through, which could allow the encoding issue to reappear.

I also looked into identifying commands based on args[0]. However, with an implementation pattern like the one used in this change—where options such as -c may be inserted at the beginning of the argument list—there is a possibility that args[0] will no longer represent the command name. If similar changes are introduced in the future, command detection based on args[0] could easily break. For that reason, I felt that relying on args[0] would not be structurally safe.

I also evaluated parsing options or inspecting the entire args array to determine the command type, but performing a complete and reliable analysis would require significant implementation effort, and at the time I judged it to be impractical.

Commands that do not use this setting (such as status or push) simply ignore it, and I have not observed any side effects. Since spawn() already sets LANG, LC_ALL, and GIT_PAGER regardless of the command type, this approach did not seem to diverge significantly from the existing behavior.

That said, I fully recognize that adding -c to all invocations is not necessarily the optimal long‑term solution.
Now that I’m revisiting this behavior, I would very much appreciate any thoughts or suggestions you might have.
At the time, I chose this implementation mainly to reduce the risk of the issue recurring, but I’m open to improving it if there’s a better approach.

Comment thread extensions/git/src/test/smoke.test.ts Outdated
Comment thread extensions/git/src/test/smoke.test.ts
Comment thread extensions/git/src/test/smoke.test.ts Outdated
@dmitrivMS

Copy link
Copy Markdown
Collaborator

yutotnh (@yutotnh) Could you please address Copilot's comments?

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@yutotnh

Copy link
Copy Markdown
Contributor Author

Dmitriy Vasyura (@dmitrivMS) Thanks for the comment.
I’ll work on this over the next few days.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Commit messages garbled depending on Git settings

4 participants